From 9823a3d98ccd5a70249b03fb5a9a0e503761b33d Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 14 Aug 2009 17:07:23 +0100 Subject: [PATCH] AMD IOMMU: Destroy passthru guests when IO pagetable allocation fails Signed-off-by: Wei Wang Acked-by: Wei Huang --- xen/drivers/passthrough/amd/iommu_map.c | 7 +++++++ xen/include/asm-x86/hvm/svm/amd-iommu-proto.h | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/xen/drivers/passthrough/amd/iommu_map.c b/xen/drivers/passthrough/amd/iommu_map.c index 352c52a182..ec06b194c9 100644 --- a/xen/drivers/passthrough/amd/iommu_map.c +++ b/xen/drivers/passthrough/amd/iommu_map.c @@ -426,7 +426,10 @@ static u64 iommu_l2e_from_pfn(struct page_info *table, int level, { table = alloc_amd_iommu_pgtable(); if ( table == NULL ) + { + printk("AMD-Vi: Cannot allocate I/O page table\n"); return 0; + } next_table_maddr = page_to_maddr(table); amd_iommu_set_page_directory_entry( (u32 *)pde, next_table_maddr, level - 1); @@ -462,6 +465,7 @@ int amd_iommu_map_page(struct domain *d, unsigned long gfn, unsigned long mfn) { spin_unlock(&hd->mapping_lock); amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn); + domain_crash(d); return -EFAULT; } set_iommu_l1e_present(iommu_l2e, gfn, (u64)mfn << PAGE_SHIFT, iw, ir); @@ -494,6 +498,7 @@ int amd_iommu_unmap_page(struct domain *d, unsigned long gfn) { spin_unlock(&hd->mapping_lock); amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn); + domain_crash(d); return -EFAULT; } @@ -535,6 +540,7 @@ int amd_iommu_reserve_domain_unity_map( spin_unlock(&hd->mapping_lock); amd_iov_error("Invalid IO pagetable entry phys_addr = %lx\n", phys_addr); + domain_crash(domain); return -EFAULT; } @@ -583,6 +589,7 @@ int amd_iommu_sync_p2m(struct domain *d) spin_unlock(&d->page_alloc_lock); spin_unlock(&hd->mapping_lock); amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn); + domain_crash(d); return -EFAULT; } diff --git a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h index 6406321931..6664fbaed2 100644 --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h @@ -131,8 +131,10 @@ static inline struct page_info* alloc_amd_iommu_pgtable(void) void *vaddr; pg = alloc_domheap_page(NULL, 0); + if ( pg == NULL ) + return 0; vaddr = map_domain_page(page_to_mfn(pg)); - if ( !vaddr ) + if ( vaddr == NULL ) return 0; memset(vaddr, 0, PAGE_SIZE); unmap_domain_page(vaddr); -- 2.30.2